PL/SQL নিরাপত্তা নিশ্চিত করার জন্য কিছু গুরুত্বপূর্ণ কৌশল এবং অনুশীলন রয়েছে যা ডেটাবেসের নিরাপত্তা বৃদ্ধি করতে সাহায্য করে। PL/SQL কোডের নিরাপত্তা শুধুমাত্র কুইরি বা ফাংশনের সুরক্ষা নয়, বরং Access Control, SQL Injection Protection, Error Handling, এবং Privileges Management নিয়েও কাজ করতে হয়। নিচে PL/SQL নিরাপত্তা সংক্রান্ত কিছু মূল বিষয় এবং কৌশল তুলে ধরা হলো।
SQL Injection হল একটি জনপ্রিয় আক্রমণ যেখানে হ্যাকাররা ইউজার ইনপুটের মাধ্যমে ক্ষতিকর SQL কোড ইনজেক্ট করে। এটি থেকে রক্ষা পেতে bind variables ব্যবহার করা সবচেয়ে ভালো পদ্ধতি। এর মাধ্যমে ডাইনামিক SQL-এ unsafe input আটকানো যায় এবং কোডের নিরাপত্তা বৃদ্ধি করা সম্ভব।
DECLARE
v_query VARCHAR2(200);
BEGIN
v_query := 'SELECT * FROM employees WHERE emp_id = ' || :emp_id;
EXECUTE IMMEDIATE v_query;
END;
এটি SQL Injection এর জন্য ঝুঁকিপূর্ণ, কারণ ইউজার emp_id
এর মাধ্যমে SQL স্টেটমেন্টে কাস্টম কোড ইনজেক্ট করতে পারে।
DECLARE
v_query VARCHAR2(200);
BEGIN
v_query := 'SELECT * FROM employees WHERE emp_id = :emp_id';
EXECUTE IMMEDIATE v_query USING :emp_id;
END;
এখানে, :emp_id
একটি bind variable হিসেবে ব্যবহৃত হয়েছে, যা SQL Injection আক্রমণ থেকে রক্ষা করবে।
PL/SQL এর নিরাপত্তা নিশ্চিত করার জন্য সঠিক privileges (অধিকার) প্রদান করা অত্যন্ত গুরুত্বপূর্ণ। ইউজারদের শুধুমাত্র তাদের কাজের জন্য প্রয়োজনীয় অধিকার দেয়া উচিত এবং least privilege principle অনুসরণ করা উচিত।
GRANT EXECUTE ON my_package TO user1;
GRANT SELECT, INSERT ON employees TO user2;
এটি নিশ্চিত করবে যে শুধুমাত্র প্রয়োজনীয় অধিকারসহ ইউজাররা কোডটি এক্সিকিউট করতে পারবে।
নিরাপত্তার জন্য PL/SQL ব্লকে exception handling ব্যবহারের মাধ্যমে অনাকাঙ্ক্ষিত তথ্যের উন্মোচন বা অ্যাটাকারের জন্য সম্ভাব্য নিরাপত্তা দুর্বলতা হ্রাস করা যেতে পারে। Exception handling কাস্টম এরর মেসেজ তৈরি করতে সাহায্য করে, যা আক্রমণকারীকে সিস্টেমের অন্তর্নিহিত অবস্থা সম্পর্কে কোনো তথ্য দেয় না।
BEGIN
-- Some operation that might fail
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('Error: ' || SQLERRM);
END;
এখানে, SQLERRM
এর মাধ্যমে পুরো এরর মেসেজ উন্মুক্ত করা হচ্ছে, যা আক্রমণকারীদের সাহায্য করতে পারে।
BEGIN
-- Some operation that might fail
EXCEPTION
WHEN OTHERS THEN
-- Log the error but don't expose it to the user
DBMS_OUTPUT.PUT_LINE('An error occurred, please contact support.');
END;
এখানে, generic error messages ব্যবহার করা হয়েছে এবং সিস্টেমের অন্তর্নিহিত তথ্য আক্রমণকারীদের সামনে আসছে না।
PL/SQL কোডের নিরাপত্তা বাড়ানোর জন্য code obfuscation ব্যবহার করা যেতে পারে, যা কোডের কার্যকারিতা ঠিক রেখে সেটি বোঝা কঠিন করে তোলে। এটি সাধারণত কোডকে সিক্রেট রাখতে এবং reverse engineering প্রতিরোধে সাহায্য করে।
আপনি প্ল/এসকিউএল কোডের ভেরিয়েবল নাম এবং ফাংশন নাম গোপন বা পরিবর্তন করতে পারেন যাতে অন্য কেউ কোডটি সহজে না বুঝতে পারে।
-- Before Obfuscation
DECLARE
total_salary NUMBER;
BEGIN
total_salary := 5000;
END;
-- After Obfuscation
DECLARE
a NUMBER;
BEGIN
a := 5000;
END;
এটি কোডের নিরাপত্তা বাড়াতে সাহায্য করে, তবে এতে ডিবাগিং এবং মেইন্টেনেন্স জটিল হয়ে যায়।
কোনো প্ল/এসকিউএল অ্যাপ্লিকেশন বা কোডের নিরাপত্তা নিশ্চিত করার জন্য auditing এবং logging অত্যন্ত গুরুত্বপূর্ণ। এর মাধ্যমে আপনি জানতে পারবেন কে কখন কী করেছে এবং কোনো অসাধু কার্যক্রম চলছে কিনা।
ডেটাবেসে DBMS_AUDIT
বা DBMS_LOG
ব্যবহার করে সমস্ত গুরুত্বপূর্ণ ইভেন্ট লগ করা যেতে পারে।
BEGIN
-- Log an event
DBMS_AUDIT.LOG_EVENT('User1 executed a sensitive operation');
END;
এটি আপনাকে সিস্টেমে যেকোনো অস্বাভাবিক কার্যক্রম শনাক্ত করতে সহায়ক হতে পারে।
আপনার PL/SQL কোডে সংবেদনশীল তথ্য যেমন পাসওয়ার্ড, ক্রেডিট কার্ড নম্বর ইত্যাদি নিরাপদ রাখতে encryption ব্যবহার করা জরুরি। Oracle DBMS_CRYPTO প্যাকেজের মাধ্যমে আপনি ডেটা এনক্রিপ্ট এবং ডিক্রিপ্ট করতে পারেন।
DECLARE
v_encrypted_data VARCHAR2(100);
BEGIN
v_encrypted_data := DBMS_CRYPTO.ENCRYPT(
'Sensitive Data',
DBMS_CRYPTO.DES_CBC_PKCS5,
'encryption_key'
);
END;
এটি নিশ্চিত করে যে সংবেদনশীল ডেটা শুধু অনুমোদিত ব্যক্তির জন্যই পড়া যাবে।
PL/SQL কোডে ব্যবহারকারীদের সঙ্গে সংযোগের ক্ষেত্রে secure connections ব্যবহার নিশ্চিত করুন। SSL/TLS কনফিগারেশন ব্যবহার করা অত্যন্ত গুরুত্বপূর্ণ, বিশেষ করে যদি ডেটাবেস সার্ভার ও অ্যাপ্লিকেশন সার্ভারের মধ্যে সংযোগ প্রক্রিয়া হয়।
কিছু PL/SQL procedures বা ফাংশনগুলো আপনার সিস্টেমের জন্য খুবই গুরুত্বপূর্ণ এবং এগুলির এক্সিকিউশনের জন্য খুবই সীমিত অনুমতি থাকা উচিত। উদাহরণস্বরূপ, DBMS_METADATA, DBMS_SCHEDULER, DBMS_SQL ইত্যাদি এরকম কিট প্যাকেজগুলির ব্যবহার শুধুমাত্র নির্দিষ্ট ব্যবহারকারীদের কাছে সীমিত রাখতে হবে।
PL/SQL নিরাপত্তা একটি ব্যাপক প্রক্রিয়া, যা নিরাপদ কোড লেখা, privileges management, SQL injection protection, encryption, এবং auditing ইত্যাদি বিষয়গুলিকে অন্তর্ভুক্ত করে। এই কৌশলগুলির মাধ্যমে আপনি আপনার PL/SQL অ্যাপ্লিকেশনগুলির নিরাপত্তা নিশ্চিত করতে পারেন এবং আক্রমণকারীদের বিরুদ্ধে সুরক্ষা বৃদ্ধি করতে পারেন।
PL/SQL (Procedural Language/SQL) একটি শক্তিশালী প্রোগ্রামিং ভাষা যা Oracle Database-এর সাথে ব্যবহৃত হয়। এটি শুধুমাত্র ডেটাবেসের সাথে ইন্টারঅ্যাক্ট করার জন্য ব্যবহৃত হয় না, বরং ডেটা ম্যানিপুলেশন, ব্যবসায়িক লজিক এবং অটোমেশন কাজ করার জন্যও ব্যবহৃত হয়। কিন্তু যখন এটি ডেটাবেসের উপর অনেক বেশি ক্ষমতা প্রদান করে, তখন এর সিকিউরিটি ব্যবস্থা নিশ্চিত করা অত্যন্ত গুরুত্বপূর্ণ।
PL/SQL সিকিউরিটি ফিচারগুলি ডেটাবেস অ্যাপ্লিকেশনের নিরাপত্তা নিশ্চিত করতে সাহায্য করে, যেমন অপ্রত্যাশিত অ্যাক্সেস বা ম্যালিসিয়াস কোড প্রতিরোধ করা। নিচে PL/SQL এর কিছু গুরুত্বপূর্ণ সিকিউরিটি ফিচার আলোচনা করা হলো।
PL/SQL এ দুটি ধরণের অধিকার থাকে:
Definer Rights
-এ রান করে, তখন এটি ব্যবহারকারীর অ্যাকাউন্টের অধিকার এবং অনুমতির আওতায় কার্যকর হয়। অর্থাৎ, যে ব্যবহারকারী প্রোগ্রামটি তৈরি করেছে, তার অধিকার অনুযায়ী প্রোগ্রামটি চালানো হবে।Invoker Rights
-এ রান করে, তখন এটি সেই ব্যবহারকারীর অধিকার অনুযায়ী কার্যকর হয়, যারা প্রোগ্রামটি কল করবে।Definer Rights সাধারণত ডেটাবেস অ্যাডমিনিস্ট্রেটর বা উচ্চ-অধিকারপ্রাপ্ত ব্যবহারকারীদের জন্য উপযুক্ত, কারণ এটি উঁচু ক্ষমতা প্রদান করে। অন্যদিকে, Invoker Rights আরও নিরাপদ, কারণ এটি কলকারী ব্যবহারকারীর অধিকার অনুযায়ী সিকিউরিটি নিয়ন্ত্রণ করে।
-- Procedure with Definer Rights
CREATE OR REPLACE PROCEDURE add_employee (
p_emp_id IN NUMBER,
p_name IN VARCHAR2
) IS
BEGIN
INSERT INTO employees (emp_id, name) VALUES (p_emp_id, p_name);
END;
/
-- Procedure with Invoker Rights
CREATE OR REPLACE PROCEDURE add_employee_invoker
AUTHID CURRENT_USER -- This ensures Invoker Rights
(p_emp_id IN NUMBER, p_name IN VARCHAR2) IS
BEGIN
INSERT INTO employees (emp_id, name) VALUES (p_emp_id, p_name);
END;
/
PL/SQL নিরাপত্তার একটি গুরুত্বপূর্ণ অংশ হল User Privileges বা ব্যবহারকারীর অনুমতি নির্ধারণ করা। Oracle ডেটাবেসে, ব্যবহারকারীদের বিভিন্ন ধরনের অধিকার এবং অনুমতি দেওয়া হয়, যেমন:
PL/SQL প্রোগ্রাম তৈরি করার সময়, সঠিক ব্যবহারকারীর অনুমতি না দিলে এক্সিকিউশন ব্যর্থ হতে পারে।
-- Granting SELECT privilege to a user
GRANT SELECT ON employees TO user_name;
-- Granting EXECUTE privilege to a user for a procedure
GRANT EXECUTE ON add_employee TO user_name;
এছাড়া, REVOKE কমান্ড ব্যবহার করে অনুমতি প্রত্যাহার করা যায়।
Oracle ডেটাবেসে, locks ডেটাবেসের উপর একাধিক ব্যবহারকারীর অ্যাক্সেস নিয়ন্ত্রণে সাহায্য করে। PL/SQL এ, আপনি DBMS_LOCK প্যাকেজ ব্যবহার করে নির্দিষ্ট রিসোর্সে লক প্রয়োগ করতে পারেন, যাতে ডেটাবেসে কোনো অপ্রত্যাশিত পরিবর্তন বা ডেটার অপব্যবহার প্রতিরোধ করা যায়।
-- Acquiring a lock on a resource
DECLARE
v_lockhandle VARCHAR2(128);
BEGIN
DBMS_LOCK.REQUEST(lockhandle => v_lockhandle, timeout => 10);
-- Perform the database operation
DBMS_LOCK.RELEASE(v_lockhandle);
END;
/
এটি শুধুমাত্র একটি রিসোর্স বা ডেটাবেস অপারেশন যখন অন্য কোনো ইউজার এক্সেস করবে না তখন লক রাখে।
SQL Injection হল একটি নিরাপত্তা সমস্যা যেখানে আক্রমণকারী ডেটাবেসে ম্যালিসিয়াস SQL কোড ইনজেক্ট করতে পারে। PL/SQL-এ Dynamic SQL ব্যবহারের সময় বিশেষভাবে সাবধান থাকতে হয়। Oracle ডেটাবেসে EXECUTE IMMEDIATE এবং DBMS_SQL প্যাকেজ ব্যবহার করে সঠিকভাবে Dynamic SQL ব্যবহার করা যায়।
-- Example of preventing SQL Injection using Bind Variables
DECLARE
v_emp_id NUMBER := 1001;
v_sql VARCHAR2(200);
BEGIN
v_sql := 'SELECT name FROM employees WHERE emp_id = :emp_id';
EXECUTE IMMEDIATE v_sql USING v_emp_id;
END;
/
এখানে, :emp_id একটি bind variable, যা SQL ইনজেকশন প্রতিরোধে সাহায্য করে।
PL/SQL Exception Handling একটি গুরুত্বপূর্ণ সিকিউরিটি ফিচার, যেহেতু এটি ভুল বা অনাকাঙ্ক্ষিত কার্যক্রমের ক্ষেত্রে প্রোগ্রামটির সঠিক আচরণ নিশ্চিত করতে সাহায্য করে। Exception Handling ব্যবহার করে আপনি RAISE_APPLICATION_ERROR ব্যবহার করে কাস্টম এরর বার্তা তৈরি করতে পারেন, যা সিস্টেম বা ডেটাবেস লগে অপ্রত্যাশিত কার্যক্রম বা নিরাপত্তার জন্য পটেনশিয়াল সমস্যা চিহ্নিত করে।
BEGIN
-- Some business logic
IF NOT EXISTS (SELECT 1 FROM employees WHERE emp_id = 1001) THEN
RAISE_APPLICATION_ERROR(-20001, 'Employee not found!');
END IF;
END;
/
এটি একটি কাস্টম এরর বার্তা তৈরি করবে এবং একটি নিরাপত্তা বা অবৈধ অ্যাক্সেস শনাক্ত করতে সাহায্য করবে।
Oracle ডেটাবেসে Auditing এর মাধ্যমে সিস্টেমের সিকিউরিটি মনিটর করা যায়। PL/SQL প্রোগ্রামিংয়ের মাধ্যমে আপনি ডেটাবেসের যে সকল কার্যকলাপ বা পরিবর্তন ঘটছে তা লগে রেকর্ড রাখতে পারেন। এটি নিরাপত্তা পরিদর্শন ও অডিটিং প্রক্রিয়ায় গুরুত্বপূর্ণ ভূমিকা পালন করে।
-- Enable auditing on a specific table
AUDIT INSERT, UPDATE, DELETE ON employees BY ACCESS;
PL/SQL-এর সিকিউরিটি ফিচারগুলি ডেটাবেসের নিরাপত্তা নিশ্চিত করতে সাহায্য করে, বিশেষত definer rights, user privileges, dynamic SQL, exception handling, এবং auditing ব্যবহার করার মাধ্যমে। এগুলোর সঠিক প্রয়োগ ডেটাবেসে অবৈধ অ্যাক্সেস, ডেটার ক্ষতি বা পরিবর্তন প্রতিরোধে সহায়ক।
PL/SQL এর মধ্যে Definer Rights এবং Invoker Rights দুটি গুরুত্বপূর্ণ ধারণা, যা Stored Procedures, Functions, এবং Triggers এর অধিকার (permissions) নির্ধারণে ব্যবহৃত হয়। এই অধিকারগুলি নিশ্চিত করে যে, কোন ইউজার কে কোন অ্যাকশন সম্পাদন করতে পারবে, এবং এর ফলে অ্যাপ্লিকেশন সিকিউরিটি এবং এক্সেস কন্ট্রোল নিশ্চিত করা যায়।
Definer Rights হল সেই অধিকার যেখানে কোনো Procedure, Function, অথবা Trigger যেই ইউজার দ্বারা তৈরি করা হবে, সেই ইউজারের অধিকার অনুযায়ী অ্যাকশন সম্পাদিত হয়। অর্থাৎ, যখন একটি Procedure
বা Function
চালানো হয়, তখন সেই ইউজারের অনুমতি অনুসারে প্রয়োজনীয় অপারেশন সম্পাদিত হয়, যিনি এই কোডটি তৈরি করেছেন (definer)।
ধরা যাক, একটি ইউজার user_a
একটি Procedure
তৈরি করেছে যা অন্য একটি ইউজারের ডেটা অ্যাক্সেস করতে পারে। user_a
যদি Procedure
-টি Definer Rights
-এ তৈরি করে, তাহলে যেই ইউজার এই Procedure
চালাবে (যেমন user_b
), তার ডেটাবেস অ্যাক্সেসের জন্য user_a
এর অনুমতি লাগবে, কারণ কোডটি user_a
দ্বারা তৈরি হয়েছে।
CREATE OR REPLACE PROCEDURE get_employee_salary
IS
v_salary NUMBER;
BEGIN
-- Definer rights: user_a will have access to the data
SELECT salary INTO v_salary FROM employees WHERE employee_id = 100;
DBMS_OUTPUT.PUT_LINE('Salary: ' || v_salary);
END;
এখানে, get_employee_salary
পদ্ধতি user_a
দ্বারা তৈরি হয়েছে, তাই কোডটি চালানোর জন্য user_a
এর অনুমতি প্রয়োজন।
Invoker Rights হল সেই অধিকার যেখানে Procedure, Function, অথবা Trigger যেই ইউজার দ্বারা কল করা হয়, তার অধিকার অনুসারে অ্যাকশন সম্পাদিত হয়। অর্থাৎ, যদি কোন ইউজার একটি Procedure বা Function কল করে, তবে সেই ইউজারের ডেটাবেস অ্যাক্সেসের অনুমতি অনুসারে অপারেশন সম্পাদিত হবে, এবং কোডটি তৈরি করা ইউজারের (definer) অনুমতির সাথে সম্পর্কিত হবে না।
ধরা যাক, user_a
একটি Procedure
তৈরি করেছে এবং সেই Procedure
-টি Invoker Rights-এ তৈরি করা হয়েছে। এখন, যদি user_b
এই Procedure
কল করে, তবে user_b
এর অনুমতি অনুযায়ী ডেটাবেস অ্যাক্সেস হবে, না যে user_a
এর।
CREATE OR REPLACE PROCEDURE get_employee_salary
IS
v_salary NUMBER;
BEGIN
-- Invoker rights: user_b's permissions will be used to access data
SELECT salary INTO v_salary FROM employees WHERE employee_id = 100;
DBMS_OUTPUT.PUT_LINE('Salary: ' || v_salary);
END;
এখানে, যদি user_b
get_employee_salary
কল করে, তাহলে সেই user_b
এর অনুমতি অনুসারে ডেটাবেস অ্যাক্সেস হবে।
Attribute | Definer Rights | Invoker Rights |
---|---|---|
Who controls access? | Code is executed with the privileges of the definer (creator). | Code is executed with the privileges of the invoker (caller). |
Use case | When a procedure requires higher-level permissions. | When a procedure should use the caller's permissions. |
Security | More secure, since only the definer’s privileges are required. | More flexible, but might expose security risks if not handled carefully. |
Example | A stored procedure by a privileged user allows access for others. | The procedure uses the privileges of the user who calls it. |
Typical Usage | Use when the procedure must access resources that the caller may not have access to. | Use when the procedure should respect the caller's privileges. |
Oracle PL/SQL এবং অন্যান্য relational databases-এ User Privileges এবং Authorization হল দুটি গুরুত্বপূর্ণ ধারণা, যেগুলি ডেটাবেসের সুরক্ষা এবং অ্যাক্সেস কন্ট্রোলের জন্য ব্যবহৃত হয়। এগুলি নিশ্চিত করে যে শুধুমাত্র অনুমোদিত ব্যবহারকারীরা ডেটাবেসে নির্দিষ্ট কাজ করতে পারে। সঠিকভাবে privilege এবং authorization ম্যানেজ করলে ডেটাবেসের সুরক্ষা বৃদ্ধি পায় এবং অপ্রত্যাশিত বা অবৈধ অ্যাক্সেস রোধ করা যায়।
User Privileges হল সেই অনুমতিগুলি যা একটি নির্দিষ্ট ব্যবহারকারীকে ডেটাবেসের টেবিল, ভিউ, সূচক, প্রোসিডিউর, ফাংশন, এবং অন্যান্য অবজেক্টে অ্যাক্সেস প্রদান করে। ব্যবহারকারী যে কাজ করতে পারে, তা নির্ধারণ করে এই privileges।
প্রথমত, প্রিভিলেজ দুটি প্রধান শ্রেণীতে বিভক্ত হয়:
এগুলি ব্যবহারকারীকে সিস্টেম পর্যায়ে নির্দিষ্ট কাজ করার অনুমতি দেয়, যেমন টেবিল তৈরি, ব্যবহারকারী তৈরি ইত্যাদি।
এগুলি নির্দিষ্ট ডেটাবেস অবজেক্টের উপর ভিত্তি করে, যেমন টেবিল বা ভিউ:
GRANT
কমান্ড ব্যবহার করে ব্যবহারকারীকে নির্দিষ্ট প্রিভিলেজ দেওয়া হয়।
Syntax:
GRANT privilege ON object TO user;
-- Granting SELECT and INSERT privileges on the 'employees' table to user 'john'
GRANT SELECT, INSERT ON employees TO john;
এই কমান্ডের মাধ্যমে ব্যবহারকারী john-কে employees
টেবিলে SELECT এবং INSERT করার অনুমতি দেওয়া হয়।
Authorization হল সেই প্রক্রিয়া যার মাধ্যমে ডেটাবেসে কোন ব্যবহারকারী কি কাজ করতে পারবে তা নির্ধারণ করা হয়। এটি ব্যবহারকারীর identity এবং তাদের প্রিভিলেজের ভিত্তিতে কাজ করে। Authorization মেকানিজমের মাধ্যমে বিভিন্ন ব্যবহারকারীকে বিভিন্ন স্তরের অ্যাক্সেস দেয়া হয়, যাতে ডেটাবেসের সুরক্ষা নিশ্চিত করা যায়।
Syntax (GRANT):
GRANT privilege ON object TO user;
Syntax (REVOKE):
REVOKE privilege ON object FROM user;
-- Revoking DELETE privilege from user 'john' on 'employees' table
REVOKE DELETE ON employees FROM john;
এখানে, john
ব্যবহারকারীর employees
টেবিলে DELETE
প্রিভিলেজ বাতিল করা হচ্ছে।
Role হল একাধিক প্রিভিলেজের একটি সেট যা এক বা একাধিক ব্যবহারকারীর কাছে প্রদান করা যেতে পারে। ব্যবহারকারীকে একটি role প্রদান করলে, তারা সেই role এর অধিকারগুলি (privileges) অর্জন করে।
CREATE ROLE manager_role;
GRANT SELECT, INSERT, UPDATE ON employees TO manager_role;
GRANT manager_role TO john;
এখানে, manager_role
রোলটি john
ব্যবহারকারীর কাছে প্রদান করা হচ্ছে, এবং তাকে employees
টেবিলে SELECT
, INSERT
, এবং UPDATE
করার অনুমতি দেওয়া হচ্ছে।
REVOKE SELECT, INSERT ON employees FROM manager_role;
এখানে, manager_role
রোল থেকে employees
টেবিলের SELECT
এবং INSERT
প্রিভিলেজ বাতিল করা হচ্ছে।
Oracle PL/SQL-এ, যখন একটি procedure বা function তৈরি করা হয়, তখন Definer Rights এবং Invoker Rights এর মধ্যে একটি নির্বাচন করতে হয়, যা নির্ধারণ করে কে কোন প্রিভিলেজ প্রয়োগ করতে পারবে।
যখন কোনও procedure বা function Definer Rights সহ তৈরি করা হয়, তখন সেই procedure বা function-টি যে ব্যবহারকারী দ্বারা তৈরি করা হয়েছে, তার প্রিভিলেজ ব্যবহার করে এক্সিকিউট হবে। অর্থাৎ, যে ব্যবহারকারী procedure বা function তৈরি করেছে, সে যদি নির্দিষ্ট টেবিলের উপর প্রিভিলেজ না দেয়, তবুও সেই procedure বা function চালানোর সময় ওই টেবিলের উপর কাজ করা যাবে।
যখন procedure বা function Invoker Rights সহ তৈরি করা হয়, তখন যে ব্যবহারকারী ওই procedure বা function এক্সিকিউট করবে, তার প্রিভিলেজ অনুযায়ী কাজ হবে।
User Privileges এবং Authorization হল Oracle Database-এ ডেটাবেস সুরক্ষা এবং অ্যাক্সেস কন্ট্রোলের অন্যতম গুরুত্বপূর্ণ উপাদান। সঠিকভাবে privilege এবং authorization ম্যানেজ করলে ডেটাবেসের সুরক্ষা বাড়ানো যায় এবং অপ্রত্যাশিত বা অবৈধ অ্যাক্সেস রোধ করা সম্ভব হয়। GRANT
এবং REVOKE
কমান্ডগুলি ব্যবহার করে আপনি বিভিন্ন স্তরের প্রিভিলেজ কন্ট্রোল করতে পারেন, এবং রোল ব্যবস্থাপনা এর আরও এক পদক্ষেপ উন্নতি করতে সাহায্য করে।
PL/SQL দিয়ে সিকিউরিটি এনফোর্সমেন্ট বিভিন্ন উপায়ে করা যায়, যার মধ্যে রয়েছে User Privileges, Definer and Invoker Rights, Data Encryption, Access Control, এবং Exception Handling। সঠিক সিকিউরিটি প্রয়োগ করতে PL/SQL কোডে বিভিন্ন সুরক্ষা ব্যবস্থা রাখা জরুরি, বিশেষ করে ডেটাবেস অ্যাপ্লিকেশনগুলিতে। নিচে এই সিকিউরিটি বিষয়গুলো বিস্তারিত আলোচনা করা হয়েছে।
PL/SQL কোডে Definer Rights এবং Invoker Rights দুটি মৌলিক ধারণা রয়েছে যা সিকিউরিটি নিয়ন্ত্রণে ব্যবহৃত হয়। এগুলি মূলত প্রোগ্রাম ইউনিট (যেমন Procedure, Function, Trigger) এর অধিকার এবং সেগুলির কার্যকরিতা নির্ধারণ করে।
CREATE OR REPLACE PROCEDURE secure_proc
AS
BEGIN
-- This code runs with the rights of the definer (the user who owns the procedure)
SELECT * FROM sensitive_table;
END secure_proc;
/
-- Using Invoker Rights
CREATE OR REPLACE PROCEDURE secure_proc_invoker
AUTHID CURRENT_USER -- This makes the procedure use the rights of the invoker
AS
BEGIN
-- This code runs with the rights of the user calling the procedure
SELECT * FROM sensitive_table;
END secure_proc_invoker;
/
secure_proc
procedure টি ডিফাইন করা হয়েছে, এবং এটি কাজ করবে মালিকের অধিকার দিয়ে।secure_proc_invoker
procedure তে AUTHID CURRENT_USER
ব্যবহৃত হয়েছে, যার মাধ্যমে কোডটি যে ব্যবহারকারী দ্বারা চালানো হচ্ছে তার অধিকার অনুসারে কাজ করবে।সিকিউরিটি এনফোর্সমেন্টে User Privileges গুরুত্বপূর্ণ ভূমিকা পালন করে। PL/SQL কোডে User Privileges নিয়ন্ত্রণ করার মাধ্যমে আপনি সিস্টেমের নিরাপত্তা নিশ্চিত করতে পারেন।
CREATE
, DROP
, ALTER
, SELECT
, INSERT
, ইত্যাদি।SELECT
, INSERT
, UPDATE
, DELETE
ইত্যাদি।DBA
রোলটি ব্যবহারকারীদের সব ধরনের অধিকার দেয়, কিন্তু অন্য রোল শুধুমাত্র নির্দিষ্ট অধিকার দেয়।-- Granting privileges to a user
GRANT SELECT, INSERT ON employees TO user1;
-- Revoking privileges from a user
REVOKE SELECT, INSERT ON employees FROM user1;
ডেটার সুরক্ষা নিশ্চিত করতে Data Encryption একটি গুরুত্বপূর্ণ ভূমিকা পালন করে। PL/SQL-এ ডেটা এনক্রিপশনের জন্য বিভিন্ন পদ্ধতি ব্যবহার করা যায়, যেমন Oracle Advanced Security ফিচারের সাহায্যে ডেটা এনক্রিপশন।
-- Encrypting data before inserting
INSERT INTO employees (employee_name, employee_ssn)
VALUES (ENCODE('John Doe', 'AES'), ENCODE('123-45-6789', 'AES'));
-- Decrypting data before displaying
SELECT DECODE(employee_name, 'AES') FROM employees;
PL/SQL-এ Access Control হল একটি গুরুত্বপূর্ণ সিকিউরিটি ফিচার যা ডেটাবেস অ্যাক্সেস নিয়ন্ত্রণ করে। Roles এবং Privileges এর মাধ্যমে ব্যবহারকারীদের নির্দিষ্ট ডেটাবেস অপারেশন করতে দেওয়া হয়।
-- Create Role
CREATE ROLE manager_role;
-- Grant Privileges to Role
GRANT SELECT, INSERT, UPDATE ON employees TO manager_role;
-- Assign Role to User
GRANT manager_role TO john;
এভাবে, আপনি নির্দিষ্ট Role এবং Privileges অ্যাসাইন করে অ্যাক্সেস কন্ট্রোল করতে পারেন।
PL/SQL কোডে Exception Handling খুবই গুরুত্বপূর্ণ। ভুল কোড, ডেটা ইনপুট বা অন্যান্য ভুল পরিস্থিতি গুলি ডেটাবেস অ্যাপ্লিকেশন এর সিকিউরিটি নিয়ে ঝুঁকি তৈরি করতে পারে। RAISE_APPLICATION_ERROR
বা অন্যান্য exception handling ফিচার ব্যবহার করে আপনি সঠিকভাবে ত্রুটি পরিচালনা করতে পারেন।
BEGIN
-- Code that may raise an error
UPDATE employees SET salary = -1000 WHERE employee_id = 1001;
EXCEPTION
WHEN OTHERS THEN
RAISE_APPLICATION_ERROR(-20001, 'Salary cannot be negative');
END;
এখানে, যদি কোনো ভুল (যেমন, নেতিবাচক স্যালারি) ঘটলে তা RAISE_APPLICATION_ERROR ব্যবহার করে কাস্টম ত্রুটি বার্তা প্রদর্শিত হবে।
PL/SQL কোডে Auditing এবং Logging ফিচার ব্যবহার করে আপনি সমস্ত ডেটাবেস অ্যাক্সেস এবং পরিবর্তন লগ করতে পারেন, যা সিকিউরিটির একটি গুরুত্বপূর্ণ অংশ।
-- Enabling Fine Grained Auditing
BEGIN
DBMS_FGA.add_policy(
object_schema => 'HR',
object_name => 'employees',
policy_name => 'audit_salary_changes',
audit_condition => 'salary < 50000',
audit_column => 'salary');
END;
/
এই কোডের মাধ্যমে আপনি Fine Grained Auditing চালু করতে পারেন, যা নির্দিষ্ট শর্তে (যেমন, স্যালারি ৫০,০০০ এর নিচে) ডেটাবেসে পরিবর্তন হওয়া রেকর্ডগুলো ট্র্যাক করবে।
PL/SQL দিয়ে সিকিউরিটি এনফোর্সমেন্টের জন্য আপনি বিভিন্ন সিকিউরিটি পদ্ধতি ব্যবহার করতে পারেন, যেমন:
এই সিকিউরিটি ব্যবস্থা ব্যবহার করে PL/SQL কোডে সুরক্ষা এনফোর্স করা সম্ভব।
Read more